package me.corriekay.pokegoutil.utils.windows.renderer;
import java.awt.Component;
import java.util.concurrent.CompletableFuture;
import javax.swing.JTable;
import me.corriekay.pokegoutil.utils.windows.WindowStuffHelper;
/**
* A cell renderer that displays percentages in the format "xx.xx%".
*/
public class FutureCellRenderer extends DefaultCellRenderer {
@Override
public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected,
final boolean hasFocus, final int rowIndex, final int columnIndex) {
setNativeLookAndFeel(table, value, isSelected);
if (value != null) {
@SuppressWarnings("unchecked")
final CompletableFuture<String> future = (CompletableFuture<String>) value;
if (future.isDone()) {
final String resolvedValue = future.getNow("Failed.");
setText(resolvedValue);
setToolTipText(resolvedValue);
} else {
// We set a default text.
setText("... Loading ...");
future.thenAcceptAsync((String text) -> asyncSetValue(text, table, rowIndex, columnIndex));
}
}
return this;
}
/**
* Sets the text and tooltip when the value is resolved.
*
* @param textValue The text to set.
* @param table The table.
* @param rowIndex The row index.
* @param columnIndex The column index.
*/
protected void asyncSetValue(final String textValue, final JTable table, final int rowIndex, final int columnIndex) {
setText(textValue);
setToolTipText(textValue);
// We need the cell repainted
WindowStuffHelper.fireCellChanged(table, rowIndex, columnIndex);
}
}